//
// Created by lovep on 2025/3/20.
//
#include <stdlib.h>
#include "link.h"

#include <cstdio>

Status Link_Create(LinkList &L) {
    // 初始化一个空链表
    L = (LinkList) malloc(sizeof(LNode));
    if (!L) {
        exit(ERROR);
    }

    L->next = NULL;
    return OK;
}

Status Link_Insert(LinkList &L, int i, ElemType e) {
    // 链表插入，但是 i tm 不是下标
    LinkList p = L, s;
    int j = 0;

    while (p && j < i - 1) {
        p = p->next;
        j++;
    }

    if (!p || j > i - 1) {
        // 到底了或者没找到
        return ERROR;
    }

    s = (LinkList) malloc(sizeof(LNode));
    if (!s) {
        exit(ERROR);
    }
    s->data = e;
    s->next = p->next;
    p->next = s;

    return OK;
}

Status Link_Print(LinkList L) {
    LinkList s = L;

    int first = 1;
    s = s->next; // 第一个不是
    while (s) {
        if (!first) {
            printf("->");
        } else {
            first = 0;
        }
        printf("%d", s->data);
        s = s->next;
    }

    return OK;
}

Status Link_Delete(LinkList L, int i, ElemType &e) {
    LinkList p = L, q;

    int j = 0;

    while (p->next && j < i - 1) {
        p = p->next;
        j++;
    }

    if (!p->next || j > i - 1) {
        return ERROR;
    }

    // p q n
    q = p->next;
    p->next = q->next;
    e = q->data;
    free(q);

    return OK;
}


int Link_Search(LinkList L, ElemType e) {
    // 在链表中查找 e
    LinkList p = L;

    int j = 0;

    while (p->next) {
        p = p->next;
        j++;
        if (p->data == e) break;
    }

    if (!p->next) {
        return 0;
    }

    return j;
}


int Link_Sort(LinkList &L) {
    // 对链表进行选择排序
    LinkList i = L; // 目前已经排好序的下一个

    i = i->next;
    while (i) {
        // 不到最后，不结束
        LinkList j = i; // 去找最小的
        LinkList k = j; // 目前最小的
        while (j) {
            if (k->data > j->data) {
                k = j;
            }
            j = j->next;
        }

        // 交换两个位置
        ElemType temp = i->data;
        i->data = k->data;
        k->data = temp;

        i = i->next;
    }

    return OK;
}

int Link_Combine(LinkList L1, LinkList L2) {
    // 会将 L2 的内容合并到 L1 里去，必须先排好序！
    LinkList i = L1, j = L2;

    while (i->next && j->next) {
        if (i->next->data > j->next->data) {
            // 把 j 插到 i 前面去
            //    B n
            // i: 空 A B C
            // j: 空 ↑E F G
            LinkList temp = j->next;
            j->next = temp->next;
            temp->next = i->next;
            i->next = temp;
        } else {
            i = i->next;
        }
    }

    return OK;
}